package com.chl.legou.gateway.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;

/**
 * @author chlong
 * @date 2022/1/18
 */

public class JwtUtil {
    //有效期为
    public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000 一个小时

    //Jwt令牌信息
    public static final String JWT_KEY = "chltest";

    /**
     * 生成令牌
     *
     * @param id
     * @param subject
     * @param ttlMills
     * @return
     */
    public static String createJwt(String id, String subject, Long ttlMills) {
        //指定算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //当前系统时间
        long nowMillis = System.currentTimeMillis();
        //令牌签发时间
        Date date = new Date(nowMillis);
        //如果令牌有效期为null，则默认设置有效期为1小时
        if (ttlMills == null) {
            ttlMills = JwtUtil.JWT_TTL;
        }
        //令牌过期时间设置
        long expMills = nowMillis + ttlMills;
        Date expDate = new Date(expMills);

        //生成密钥
        SecretKey secretKey = generalKey();
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(id) //唯一的ID
                .setSubject(subject) // 主题 可以是JSON数据
                .setIssuer("admin") // 签发者
                .setIssuedAt(date) // 签发时间
                .signWith(signatureAlgorithm, secretKey) // 签名算法以及密匙
                .setExpiration(expDate); // 设置过期时间
        return jwtBuilder.compact();
    }

    /**
     * 生成密钥
     * @return
     */
    private static SecretKey generalKey() {
        byte[] encodeKey = Base64.getEncoder().encode(JwtUtil.JWT_KEY.getBytes());
        SecretKey secretKey = new SecretKeySpec(encodeKey,0,encodeKey.length,"AES");
        return secretKey;
    }

    /**
     * 解析令牌
     * @return
     */
    public static Claims parseJwt(String jwt){
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }


//    public static void main(String[] args) {
//        String jwt = JwtUtil.createJwt("weiyibiaoshi", "aaaaaa", null);
//        System.out.println(jwt);
//        try {
//            Claims claims = JwtUtil.parseJwt(jwt);
//            System.out.println(claims);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }

}
